require "import"
import "android.widget.GridView"
import "android.content.Context"
import "android.content.Intent"
import "java.util.Locale"
import "android.speech.SpeechRecognizer"
import "android.speech.RecognitionListener"
import "android.speech.RecognizerIntent"
import "java.util.Locale"
import "android.content.Intent"
import "android.preference.PreferenceManager"

function kill()
  speechRecognizer.destroy()
  speechRecognizer = nil
  return true
end

function l()
  local languageCodes = {
    ["Arabic"] = "ar",
    ["English"] = "en",
    ["french"] = "fr",
    ["spanish"] = "es",
    ["Turkish"] = "tr",
    ["German"] = "de",
    ["Dutch"] = "nl",
    ["Italian"] = "it",
    ["Portuguese"] = "pt",
    ["romanian"] = "ro",
    ["Russian"] = "ru",
    ["Japanese"] = "ja",
    ["Chinese"] = "zh-CN",
    ["Swedish"] = "sv",
    ["Thai"] = "th",
    ["Hindi"] = "hi",
    ["polish"] = "pl",
    ["Korean"] = "ko",
    ["Persian"] = "fa",
    ["Azerbaijani"] = "az",
    ["Bengali"] = "bn",
    ["Bulgarian"] = "bg",
    ["Catalan"] = "ca",
    ["Czech"] = "cs",
    ["Danish"] = "da",
    ["Greek"] = "el",
    ["Estonian"] = "et",
    ["Filipino"] = "fil",
    ["Finnish"] = "fi",
    ["Georgian"] = "ka",
    ["Gujarati"] = "gu",
    ["Croatian"] = "hr",
    ["Armenian"] = "hy",
    ["Indonesian"] = "id",
    ["esperanto"] = "eo",
    ["Icelandic"] = "is",
    ["canary"] = "kn",
    ["Latvian"] = "lv",
    ["Lithuanian"] = "lt",
    ["Macedonian"] = "mk",
    ["malayalam"] = "ml",
    ["maltese"] = "mt",
    ["marathi"] = "mr",
    ["Norwegian"] = "no",
    ["Ukrainian"] = "uk",
    ["punjabi"] = "pa",
    ["romansh"] = "rm",
    ["serbian"] = "sr",
    ["Slovak"] = "sk",
    ["Slovak"] = "sk",
    ["Slovenian"] = "sl",
    ["Swahili"] = "sw",
    ["Tamil"] = "ta",
    ["telugu"] = "te",
    ["Vietnamese"] = "vi",
    ["Welsh"] = "cy",
    ["Uzbek"] = "uz",
    ["Zulu"] = "zu",
    ["Hebrew"] = "iw",
    ["Urdu"] = "ur",
    ["Tajik"] = "tg"}

  local selectedLanguage = nil
  local items = {}

  for lang, _ in pairs(languageCodes) do
    items[#items + 1] = lang
  end

  local layout = {
    GridView,
    id = "grid",
    numColumns = 1,
    layout_width = "fill",
    layout_height = "fill"
  }

  local dlg = LuaDialog(this)
  dlg.View = loadlayout(layout)
  grid.adapter = SingleLineAdapter(service, items)

  -- Check if language has been selected before
  local sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this)
  local storedLanguage = sharedPrefs.getString("selectedLanguage", nil)
  if storedLanguage and languageCodes[storedLanguage] then
    selectedLanguage = storedLanguage
   else
    dlg.setTitle("Voice Dictation, v2.0")
  end

  dlg.setButton("Exit", nil)
  .show()

  grid.onItemClick = function(l, v)
    dlg.dismiss()
    task(500, function()
      local language = v.text
      languageCode = languageCodes[language]

      if languageCode then
        selectedLanguage = language -- Update the selected language
        -- Save the selected language to shared preferences
        local editor = sharedPrefs.edit()
        editor.putString("selectedLanguage", selectedLanguage)
        editor.apply()
        service.speak(language.. " language selected")
      end
    end)
  end
end
-- l functionமுடிவு

if speechRecognizer then
  kill()
  l()
 else

  local substitutionTable = {
    ["chino"] = "Jieshuo"
  }

  function hasInternetConnection()
    local connectivityManager = this.getSystemService(Context.CONNECTIVITY_SERVICE)
    local networkInfo = connectivityManager.getActiveNetworkInfo()
    return networkInfo ~= nil and networkInfo.isConnected()
  end

  function kill()
    speechRecognizer.destroy()
    speechRecognizer = nil
    return true
  end

  function startListening()
    if not hasInternetConnection() then
      service.asyncSpeak("இணைய இணைப்பு இல்லை.இணைய இணைப்பை சரி பார்த்த பிறகு  மீண்டும் முயலவும்.")
      return false
    end

    local verbalizationDetected = false

    speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this)

    speechListener = RecognitionListener{
      onResults = function(results)
        data = results.getParcelableArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
        if data ~= nil and data.size() > 0 then
          verbalizationDetected = true
          local recognizedText = data.get(0)
          local node = service.getEditText()
          local editText = service.getText(node)

          if editText and string.len(editText) > 0 then
            recognizedText = " " .. recognizedText
          end


          service.insertText(node, recognizedText)
          service.speak(recognizedText)
          kill()
        end

        if not verbalizationDetected then
          kill()
          return false
        end
      end,
      onError = function()
        kill()
        return false
      end
    }

    recognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, languageCode)
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName())

    speechRecognizer.startListening(recognizerIntent)
    speechRecognizer.setRecognitionListener(speechListener)

    return true
  end

  startListening()
  return true
end